/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package productos.beans;

import entities.HistoricoProducto;
import entities.Producto;
import entities.Usuario;
import facades.EtapaProductoFacade;
import facades.ProductoFacade;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.enterprise.context.SessionScoped;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import qualifiers.EventoEntidadCreada;
import qualifiers.EventoEntidadElegida;
import qualifiers.UsuarioLogeado;

/**
 *
 * @author damfercer
 */
@Named
@SessionScoped
public class NuevoProductoBean implements Serializable{
    private Producto nuevoProducto;
    @Inject
    private ProductoFacade productoFacade;
    @Inject
    private EtapaProductoFacade etapaProductoFacade;
    @Inject
    @UsuarioLogeado
    private Usuario usuarioLogeado;
    @Inject
    @EventoEntidadCreada
    private Event<Producto> eventoNuevoProducto;

    /**
     * Creates a new instance of NuevoProductoBean
     */
    public NuevoProductoBean() {
        nuevoProducto=new Producto();
    }

    /**
     * @return the nuevoProducto
     */
    public Producto getNuevoProducto() {
        return nuevoProducto;
    }

    /**
     * @param nuevoProducto the nuevoProducto to set
     */
    public void setNuevoProducto(Producto nuevoProducto) {
        this.nuevoProducto = nuevoProducto;
    }
    
    public void crearProducto(){
        if(!productoFacade.existeProducto(nuevoProducto)){
            Date ahora=new Date();
            nuevoProducto.setUsuarioCreador(usuarioLogeado);
            nuevoProducto.setUltimoUsuario(usuarioLogeado);
            nuevoProducto.setUltimaModificacion(ahora);
            nuevoProducto.setFechaRegistro(ahora);
            nuevoProducto.setActivo(Boolean.TRUE);
            nuevoProducto.setEtapa(etapaProductoFacade.find(1));
            productoFacade.create(nuevoProducto);
            if(usuarioLogeado.getProductosCreadosList()==null){
                usuarioLogeado.setProductosCreadosList(new ArrayList<Producto>());
            }
            if(usuarioLogeado.getProductosUltimoModificadoList()==null){
                usuarioLogeado.setProductosUltimoModificadoList(new ArrayList<Producto>());
            }
            usuarioLogeado.getProductosCreadosList().add(nuevoProducto);
            eventoNuevoProducto.fire(nuevoProducto); 
            duplicarUltimoProducto();
        }
        else{
            FacesContext context = FacesContext.getCurrentInstance();
            HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
            Locale locale=context.getViewRoot().getLocale();
            ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
            String errorProductoDuplicado=rb.getString("ErrorProductoDuplicado");
            FacesMessage msg =new FacesMessage(errorProductoDuplicado,errorProductoDuplicado);
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            context.addMessage(null, msg);
            context.renderResponse();
        }
        
    }
    
    public void onElegirProducto(@Observes @EventoEntidadElegida Producto p){
        this.nuevoProducto=p.clone();
        this.nuevoProducto.setHistoricoProductoList(new ArrayList<HistoricoProducto>());
        this.nuevoProducto.setColor(null);
    }
    
    public void reiniciarProducto(){
        this.setNuevoProducto(new Producto());
    }
    
    public void duplicarUltimoProducto(){
        this.nuevoProducto=null;
        Producto nuevo=productoFacade.getUltimoProducto();
        if(nuevo!=null){
            this.nuevoProducto=nuevo.clone();
            this.nuevoProducto.setHistoricoProductoList(new ArrayList<HistoricoProducto>());
            this.nuevoProducto.setColor(null);
        }
        else{
            nuevo=new Producto();
            this.nuevoProducto=nuevo;
        }
    }
}
